name: CI

on:
  # https://docs.github.com/en/actions/using-workflows/triggering-a-workflow#example-including-branches-and-tags
  push:
    # Sequence of patterns matched against refs/heads
    branches:
      - master
    # Sequence of patterns matched against refs/tags
    tags:
      - '*'
  pull_request:
    branches: [ "master" ]

jobs:
  build-linux:
    name: Build Linux packages
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [14.x]
    env:
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    steps:
    - name: Checkout code
      uses: actions/checkout@v3
    - name: Setup Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v3
      with:
        node-version: ${{ matrix.node-version }}
    - name: Environment variables
      run: |
        # https://docs.github.com/en/actions/learn-github-actions/variables#default-environment-variables
        echo "• GITHUB_REF_NAME=$GITHUB_REF_NAME"
        echo "• GITHUB_REF_TYPE=$GITHUB_REF_TYPE" # `branch` or `tag`
        echo "• GITHUB_RUN_NUMBER=$GITHUB_RUN_NUMBER"
        echo "• GITHUB_SHA=$GITHUB_SHA"
        echo "• RUNNER_ARCH=$RUNNER_ARCH"
        echo "• RUNNER_NAME=$RUNNER_NAME"
        echo "• RUNNER_OS=$RUNNER_OS"
        echo "• RUNNER_TEMP=$RUNNER_TEMP"
        echo "• RUNNER_TOOL_CACHE=$RUNNER_TOOL_CACHE"
    - name: Install Yarn package manager
      run: npm install -g yarn
    - name: Install necessary dependencies and perform initial checks
      run: |
        yarn up
        yarn install
        yarn lint
        yarn test
    - name: Run "build" script
      if: github.ref_type == 'tag'
      run: yarn run build
    - name: Run "build-latest" script
      if: github.ref_type == 'branch'
      run: yarn run build-latest
    - name: Build Linux binaries
      run: |
        yarn run build:linux
    - name: Prepare release assets
      shell: bash
      run: |
        GIT_COMMIT_LOG=`git log -1 --format='%ci %H %s'`
        PRODUCT_NAME=CNCjs
        PACKAGE_NAME=`node -e "console.log(require('./src/package.json').name)"`
        PACKAGE_VERSION=`node -e "console.log(require('./src/package.json').version)"`
        mkdir -p releases/linux
        cp -af "output/${PACKAGE_NAME}-${PACKAGE_VERSION}.x86_64.rpm" "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux.x86_64.rpm"
        cp -af "output/${PRODUCT_NAME}-${PACKAGE_VERSION}.AppImage" "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-x86_64.AppImage"
        cp -af "output/${PACKAGE_NAME}_${PACKAGE_VERSION}_amd64.deb" "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-amd64.deb"
        cp -af "output/${PACKAGE_NAME}-${PACKAGE_VERSION}.armv7l.rpm" "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux.armv7l.rpm"
        cp -af "output/${PRODUCT_NAME}-${PACKAGE_VERSION}-armv7l.AppImage" "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-armv7l.AppImage"
        cp -af "output/${PACKAGE_NAME}_${PACKAGE_VERSION}_armv7l.deb" "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-armv7l.deb"
        cp -af "output/${PACKAGE_NAME}-${PACKAGE_VERSION}.aarch64.rpm" "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux.aarch64.rpm"
        cp -af "output/${PRODUCT_NAME}-${PACKAGE_VERSION}-arm64.AppImage" "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-arm64.AppImage"
        cp -af "output/${PACKAGE_NAME}_${PACKAGE_VERSION}_arm64.deb" "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-arm64.deb"
        pushd releases/linux
        ln -sf ../../output/linux-unpacked "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-x64"
        tar zcfh "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-x64.tar.gz" "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-x64"
        rm -f "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-x64"
        ln -sf ../../output/linux-armv7l-unpacked "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-armv7l"
        tar zcfh "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-armv7l.tar.gz" "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-armv7l"
        rm -f "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-armv7l"
        ln -sf ../../output/linux-arm64-unpacked "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-arm64"
        tar zcfh "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-arm64.tar.gz" "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-arm64"
        rm -f "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-arm64"
        popd
        ls -al output releases/linux
        if [[ "$GITHUB_REF_TYPE" == "branch" && "$GITHUB_REF_NAME" == "master" ]]; then
          yarn github-release delete \
            --owner=cncjs \
            --repo=cncjs \
            --tag="${GITHUB_REF_NAME}-latest" \
            --release-name="${GITHUB_REF_NAME}" \
            "*-linux*";
          yarn github-release upload \
            --owner=cncjs \
            --repo=cncjs \
            --tag="${GITHUB_REF_NAME}-latest" \
            --release-name="${GITHUB_REF_NAME}" \
            --body="${GIT_COMMIT_LOG}" \
            releases/linux/*;
        fi
    #- name: Upload release assets
    #  uses: actions/github-script@v6
    #  with:
    #    github-token: ${{ secrets.GITHUB_TOKEN }}
    #    script: |
    #      // https://github.com/actions/upload-release-asset/issues/47#issuecomment-659071145
    #      console.log('environment:', process.versions);
    - name: Release
      uses: softprops/action-gh-release@v1
      if: startsWith(github.ref, 'refs/tags/')
      with:
        files: |
          releases/linux/*

  build-macos:
    name: Build macOS packages
    runs-on: macos-latest
    strategy:
      matrix:
        node-version: [14.x]
    env:
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    steps:
    - name: Checkout code
      uses: actions/checkout@v3
    - name: Setup Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v3
      with:
        node-version: ${{ matrix.node-version }}
    - name: Environment variables
      run: |
        # https://docs.github.com/en/actions/learn-github-actions/variables#default-environment-variables
        echo "• GITHUB_REF_NAME=$GITHUB_REF_NAME"
        echo "• GITHUB_REF_TYPE=$GITHUB_REF_TYPE" # `branch` or `tag`
        echo "• GITHUB_RUN_NUMBER=$GITHUB_RUN_NUMBER"
        echo "• GITHUB_SHA=$GITHUB_SHA"
        echo "• RUNNER_ARCH=$RUNNER_ARCH"
        echo "• RUNNER_NAME=$RUNNER_NAME"
        echo "• RUNNER_OS=$RUNNER_OS"
        echo "• RUNNER_TEMP=$RUNNER_TEMP"
        echo "• RUNNER_TOOL_CACHE=$RUNNER_TOOL_CACHE"
    - name: Install Yarn package manager
      run: npm install -g yarn
    - name: Install necessary dependencies and perform initial checks
      run: |
        yarn up
        yarn install
        yarn lint
        yarn test
    - name: Run "build" script
      if: github.ref_type == 'tag'
      run: yarn run build
    - name: Run "build-latest" script
      if: github.ref_type == 'branch'
      run: yarn run build-latest
    - name: Build macOS binaries
      run: yarn run build:macos
    - name: Prepare release assets
      shell: bash
      run: |
        GIT_COMMIT_LOG=`git log -1 --format='%ci %H %s'`
        PRODUCT_NAME=CNCjs
        PACKAGE_NAME=`node -e "console.log(require('./src/package.json').name)"`
        PACKAGE_VERSION=`node -e "console.log(require('./src/package.json').version)"`
        mkdir -p releases/macos
        cp -af "output/${PRODUCT_NAME}-${PACKAGE_VERSION}.dmg" "releases/macos/${PACKAGE_NAME}-${PACKAGE_VERSION}-macos-x64.dmg"
        cp -af "output/${PRODUCT_NAME}-${PACKAGE_VERSION}-arm64.dmg" "releases/macos/${PACKAGE_NAME}-${PACKAGE_VERSION}-macos-arm64.dmg"
        ls -al output releases/macos
        if [[ "$GITHUB_REF_TYPE" == "branch" && "$GITHUB_REF_NAME" == "master" ]]; then
          yarn github-release delete \
            --owner=cncjs \
            --repo=cncjs \
            --tag="${GITHUB_REF_NAME}-latest" \
            --release-name="${GITHUB_REF_NAME}" \
            "*-macos*";
          yarn github-release upload \
            --owner=cncjs \
            --repo=cncjs \
            --tag="${GITHUB_REF_NAME}-latest" \
            --release-name="${GITHUB_REF_NAME}" \
            --body="${GIT_COMMIT_LOG}" \
            releases/macos/*;
        fi
    #- name: Upload release assets
    #  uses: actions/github-script@v6
    #  with:
    #    github-token: ${{ secrets.GITHUB_TOKEN }}
    #    script: |
    #      // https://github.com/actions/upload-release-asset/issues/47#issuecomment-659071145
    #      console.log('environment:', process.versions);
    - name: Release
      uses: softprops/action-gh-release@v1
      if: startsWith(github.ref, 'refs/tags/')
      with:
        files: |
          releases/macos/*

  build-windows:
    name: Build Windows packages
    runs-on: windows-latest
    strategy:
      matrix:
        node-version: [14.x]
    env:
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    steps:
    - name: Prepare VC++ Runtime
      run: choco install -y vcredist2017
    - name: Checkout code
      uses: actions/checkout@v3
    - name: Setup Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v3
      with:
        node-version: ${{ matrix.node-version }}
    - name: Environment variables
      run: |
        # https://docs.github.com/en/actions/learn-github-actions/variables#default-environment-variables
        echo "• GITHUB_REF_NAME=$GITHUB_REF_NAME"
        echo "• GITHUB_REF_TYPE=$GITHUB_REF_TYPE" # `branch` or `tag`
        echo "• GITHUB_RUN_NUMBER=$GITHUB_RUN_NUMBER"
        echo "• GITHUB_SHA=$GITHUB_SHA"
        echo "• RUNNER_ARCH=$RUNNER_ARCH"
        echo "• RUNNER_NAME=$RUNNER_NAME"
        echo "• RUNNER_OS=$RUNNER_OS"
        echo "• RUNNER_TEMP=$RUNNER_TEMP"
        echo "• RUNNER_TOOL_CACHE=$RUNNER_TOOL_CACHE"
    - name: Install Yarn package manager
      run: npm install -g yarn
    - name: Install necessary dependencies and perform initial checks
      run: |
        yarn up
        yarn install
        yarn lint
        yarn test
    - name: Run "build" script
      if: github.ref_type == 'tag'
      run: yarn run build
    - name: Run "build-latest" script
      if: github.ref_type == 'branch'
      run: yarn run build-latest
    - name: Build Windows binaries
      run: yarn run build:windows
    - name: Prepare release assets
      shell: bash
      run: |
        GIT_COMMIT_LOG=`git log -1 --format='%ci %H %s'`
        PRODUCT_NAME=CNCjs
        PACKAGE_NAME=`node -e "console.log(require('./src/package.json').name)"`
        PACKAGE_VERSION=`node -e "console.log(require('./src/package.json').version)"`
        mkdir -p releases/windows
        cp -af "output/${PRODUCT_NAME} Setup ${PACKAGE_VERSION}.exe" "releases/windows/${PACKAGE_NAME}-${PACKAGE_VERSION}-windows-x64.exe"
        ls -al output releases/windows
        if [[ "$GITHUB_REF_TYPE" == "branch" && "$GITHUB_REF_NAME" == "master" ]]; then
          yarn github-release delete \
            --owner=cncjs \
            --repo=cncjs \
            --tag="${GITHUB_REF_NAME}-latest" \
            --release-name="${GITHUB_REF_NAME}" \
            "*-windows*";
          yarn github-release upload \
            --owner=cncjs \
            --repo=cncjs \
            --tag="${GITHUB_REF_NAME}-latest" \
            --release-name="${GITHUB_REF_NAME}" \
            --body="${GIT_COMMIT_LOG}" \
            releases/windows/*;
        fi
    #- name: Upload release assets
    #  uses: actions/github-script@v6
    #  with:
    #    github-token: ${{ secrets.GITHUB_TOKEN }}
    #    script: |
    #      // https://github.com/actions/upload-release-asset/issues/47#issuecomment-659071145
    #      console.log('environment:', process.versions);
    - name: Release
      uses: softprops/action-gh-release@v1
      if: startsWith(github.ref, 'refs/tags/')
      with:
        files: |
          releases/windows/*
